package com.bzg.baseSpringComponent.beanFactory;

import com.bzg.spring.component.UserService;
import org.springframework.beans.factory.HierarchicalBeanFactory;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * beanFactory，spring容器的顶级接口，创建、管理Bean的整个声明周期
 * 核心实现：DefaultListableBeanFactory。
 * beanFactory有很多子接口，每个子接口提供不同的功能，是一种接口设计模式
 * @see org.springframework.beans.factory.ListableBeanFactory
 * @see org.springframework.beans.factory.config.ConfigurableBeanFactory
 * @see HierarchicalBeanFactory
 * @see AutowireCapableBeanFactory
 * @see org.springframework.beans.factory.config.ConfigurableListableBeanFactory
 * ...
 * */
public class BeanFactoryStyle {

	/**
	 * beanFactory和ApplicationContext的区别
	 * ApplicationContext代表spring应用上下文实例，也就是管理了整个spring应用，既然管理了整个spring应用，那么他就应该具有各个组件的功能
	 * 所以ApplicationContext实现了spring中各组件的顶级接口，如：beanFactory、ApplicationEventPublisher等(但具体做事的还是这些组件)
	 * 同时ApplicationContext还负责应用的启动(包含各组件的创建)。所以ApplicationContext功能十分强大，我们一般也是基于他去启动Spring。
	 * 而BeanFactory作为ioc容器的顶级接口，其本质责任是辅助bean的管理，当然如果我们仅仅都只需要使用ioc容器的功能话，也可以直接创建一个BeanFactory来
	 * 使用。看下面例子
	 * */
	public static void main(String[] args) {
		DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
		AbstractBeanDefinition beanDefinition =
				BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
		beanDefinition.setBeanClass(UserService.class);
		beanFactory.registerBeanDefinition("user", beanDefinition);
		System.out.println(beanFactory.getBean("user"));
	}

}
